;; 代码折叠
(load-library "hideshow")
(add-hook 'c-mode-hook 'hs-minor-mode)
(add-hook 'cc-mode-hook 'hs-minor-mode)

;; 开启cmake-mode
(require-package 'cmake-mode)

;; 调用google-c-style风格
;(require 'google-c-style)
;(add-hook 'c-mode-common-hook 'google-set-c-style)
;(add-hook 'c-mode-common-hook 'google-make-newline-indent)
;;(add-hook 'c-mode-hook 'google-c-style)
;;(add-hook 'cc-mode-hook 'google-c-style)

;; 关于ccmode的补充
;; 自定义函数，将google风格中的2个空格字符缩进和空格
;; 改为我喜欢的tab键并将tab设置为4空格宽度
(defun lugg/cc-mode-hook ()
  (interactive)
  (setq c-default-style "google";;默认使用google风格的c
        c-basic-offset 4;;基本缩进宽度4个字符
        indent-tabs-mode nil;;禁止空格替换Tab
        ;;tab-always-indent 'complete;;teb键实现缩进和补全
        default-tab-width 4)
  ;; 添加自动加载系统库TAGS，TAGS默认放在$HOME/.emacs.d/TAGS
  (setq tags-file-name "~/.emacs.d/TAGS")
  ;;使用google风格的C代码方式
  (require 'google-c-style)
  (google-set-c-style)
  (google-make-newline-indent)
  (require-package 'company-c-headers) ;;添加头文件补全插件
  (global-company-mode)
  (add-to-list 'company-backends 'company-c-headers)
  ;; <F12>在头文件和源文件件跳转
  (define-key c-mode-map (kbd "<f12>") 'ff-find-other-file)
  ;;添加C-c TAB为补全快捷键
  (define-key c-mode-map (kbd "C-c TAB") 'company-complete))
(add-hook 'c-mode-hook 'lugg/cc-mode-hook)
(add-hook 'c++-mode-hook 'lugg/cc-mode-hook)

;; 自定义函数用于调整C代码为标准格式，调整后行首全部用Tab键缩进
(defun lugg/cc-mode-indent-buffer ()
  "Indent the whole buffer."
  (interactive)
  (save-excursion
    (goto-char (point-min))
		(while (re-search-forward "	" nil t) (replace-match "    "))
    ;;(while (re-search-forward "^[	 ][	 ]*" nil t) (replace-match " ")) ;;用一个空格键替换行首的所有Tab和空格
    (goto-char (point-min))
    (while (re-search-forward "[	 ]+$" nil t) (replace-match "")) ;;删除行尾的Tab和空格
    (goto-char (point-min))
    (while
				(re-search-forward "/\\**<" nil t)
			(progn
				(replace-match "/**<") ;;'/*<'转换为'/**<'
				(doxymacs-insert-member-comment))) ;;/**< ... */处执行C-cd;
    (indent-region (point-min) (point-max) nil))) ;;用indent-region调整代码

;; 自动创建TAGS文件
(if (equal system-type 'gnu/linux)
	(if (not (file-exists-p
			  (expand-file-name "TAGS" user-emacs-directory)))
		(progn
		  (shell-cd user-emacs-directory)
		  (shell-command "find /usr/include /usr/local/include -name \"*.[chsCHS]\" -print | etags -"))))

;; 创建TAGS的指令
(defun lugg/create-etags ()
  "在制定目录创建一个包含子目录内容的TAGS"
  (interactive)
  (let
    ((dir ""))
    (setq dir
          (read-directory-name "generate tags directory: " nil "" t))
    (with-temp-buffer
      (shell-cd dir)
      (shell-command
       (concat "find " dir " -name \"*.[chsCHS]\" -print | etags -")
       (buffer-name)))))

;; GDB使用的初始化配置
;; M-x gdb RET
;; 输入gdb -i=mi --annotate=3 prog启动程序

  ;; <F9>调整当前buffer的C代码格式
  (global-set-key (kbd "<f9>") 'lugg/cc-mode-indent-buffer)
(defun my-gdb-key-bind ()
  "绑定GDB快捷键"
  (interactive)
  (define-key c-mode-map [(f3)] 'gud-break) ;;添加断点
  (define-key c-mode-map [(f4)] 'gud-remove) ;;删除断点
  (define-key c-mode-map [(f5)] 'gud-go) ;;运行程序
  (define-key c-mode-map [(f6)] 'gud-finish) ;;跳出函数
  (define-key c-mode-map [(f7)] 'gud-step) ;;单步入函数
  (define-key c-mode-map [(f8)] 'gud-next) ;;单步不入函数
  (define-key c-mode-map [(f9)] 'lugg/cc-mode-indent-buffer)) ;; <F9>调整当前buffer的C代码格式
;; 进入gdb模式后调用这个函数
;; gud快捷键
;; 添加断点		gud-break		C-x C-a C-b
;; 删除断点		gud-remove		C-x C-a C-d
;; 运行程序		gud-go			无
;; 单步不入函数		gud-next		C-x C-a C-n
;; 单步入函数		gud-step		C-x C-a C-s
;; 跳出函数		gud-finish		C-x C-a C-f
;; 运行到光标处		gud-until		C-x C-a C-u
;; 继续运行程序		gud-cont		C-x C-a C-r

;; 编译完成后显示滚动到*compilation*buffer的最后
(setq compilation-scroll-output t)
;; first-error函数，编译出错时跳转到错误处

(provide 'init-mycc-mode)

;; C语言中的移动功能。
;; C-M-a 跳到函数的开始。
;; C-M-e 跳到函数的结尾。
;; M-a 跳到上一个语句。
;; M-e 跳到下一个语句。
;; C-M-b 当光标置于｝的后面时，跳转到与之匹配的｛。
;; C-M-f  当光标置于｛的后面时，跳转到与之匹配的｝。
;; C-c C-u 跳转到上一个条件编译的条件处。
